//=============================================================================

#include "../../../../inc/aWorld.h"

//=============================================================================

aWorld::aWorld()
{
  caption = "Testing room";
  gravity.avSet(0.0f, -9.8f, 0.0f);
  magesFiles.alAddItem()->data = WOMB.afGetPath("characters", "mage.obj");
  lastId = 0;
}

//=============================================================================

void aWorld::awInit()
{
  aItem<aString>* tmpString = magesFiles.alGetFirstItem();

  //while(tmpString)
  //{
  //  tmpString = tmpString->next;
  //}
  magesSpecimens.alAddItem()->data.acLoadCharacter(WOMB.afGetProjectPath());
}

//=============================================================================

void aWorld::awBornWorld()
{
  awClearWorld();
  ground.agGenerateFlatMap(20.0f, 20.0f, 1.0f, 1.0f);
  ground.asLoadSkin("sources\\characters\\mage\\skin.tga");
}

//=============================================================================

void aWorld::awWorldProcess()
{
  ground.asDrawSurface();

  aItem<aMage>* tmpMage = mages.alGetFirstItem();

  while(tmpMage)
  {
    tmpMage->data.aoDrawObject();

    tmpMage = tmpMage->next;
  }
}

//=============================================================================

void aWorld::awChewTheActions()
{
  aItem<aAction>* tmpAction = actions.alGetFirstItem();

  while(tmpAction)
  {
    switch(tmpAction->data.aaGetType())
    {
      case ACT_PUSH:
      {
        break;
      }
      default:
      {
        break;
      }
    }
    tmpAction = tmpAction->next;
  }
  actions.alRemoveItems();
}

//=============================================================================

void aWorld::awAddMage(const unsigned char mage, const aVector& vec)
{
  aItem<aMage>* tmpMage = magesSpecimens.alGetFirstItem();

  while(tmpMage)
  {
    if (mage == tmpMage->data.amGetType())
    {
      mages.alAddItem()->data.amCloneMage(tmpMage->data);
      if (freeIds.alGetLastItem())
      {
        mages.alGetLastItem()->data.id = freeIds.alGetLastItem()->data;
        freeIds.alRemoveLastItem();
      }
      else
        mages.alGetLastItem()->data.id = lastId++;

      mages.alGetLastItem()->data.model.origin = vec;

      break;
    }

    tmpMage = tmpMage->next;
  }
}

//=============================================================================

void aWorld::awProceedPackets()
{
  aItem<aPacket>* tmpPacket = packets.alGetFirstItem();

  while(tmpPacket)
  {
    switch(tmpPacket->data.apGetType())
    {
      case PAK_ADD_MAGE:
      {
        aPacketAddMage addMage(tmpPacket->data.apGetData());

        awAddMage(addMage.mageType, aVector(addMage.pos[0], addMage.pos[1], addMage.pos[2]));

        break;
      }
      default:
      {
        break;
      }
    }
    tmpPacket = tmpPacket->next;
  }

  packets.alRemoveItems();
}

//=============================================================================

void aWorld::awClearWorld()
{
  aItem<aMage>* tmpMage = mages.alGetFirstItem();

  while(tmpMage)
  {
    tmpMage->data.amRemoveMage();
    tmpMage = tmpMage->next;
  }

  lastId = 0;
  freeIds.alRemoveItems();
}

//=============================================================================

aWorld::~aWorld()
{
  awClearWorld();
}

//=============================================================================
